package main

import (
	"gitee.com/huanminabc/go-utils/common"
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	log "github.com/sirupsen/logrus"
	"net/http"
	"reflect"
	"time"
)

func serveRun() {
	// 初始化一个http服务对象 (采用默认的插件Logger(), Recovery(报错不宕机))
	//gin.SetMode(gin.ReleaseMode) // 设置为发布模式 ,不会打印请求日志,生产模式下使用
	// 使用 gin.New() 创建一个没有任何中间件的引擎实例
	engine := gin.New()
	engine.Use(gin.Recovery()) // 使用默认的Recovery中间件用于恢复从控制器函数中发生的恐慌
	engine.Use(Logger())       // 使用自定义的日志中间件,而不使用默认的Logger中间件
	// 配置跨域中间件
	config := cors.DefaultConfig()
	config.AllowAllOrigins = true // 允许所有来源的访问，也可以根据需要设置为特定的来源
	// 将跨域中间件添加到Gin路由器中
	engine.Use(cors.New(config))
	// 设置一个get请求的路由，url为localhost
	engine.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "hello World!")
	})
	// 遍历interfaceHandles，调用每个函数,进行注册路由
	for _, v := range interfaceHandles {
		reflect.ValueOf(v).Call([]reflect.Value{reflect.ValueOf(engine)})
	}
	//监听并启动服务，默认 http://localhost:8798/
	engine.Run(":8798")
}

// 自定义个日志中间件
func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		t := time.Now()
		traceId := common.RandStringRunes()
		// 可以通过上下文对象，设置一些依附在上下文对象里面的键/值数据
		c.Set("traceId", traceId)
		//线程是安全的
		log.SetFormatter(&common.LogFileFormatter{
			TraceId: traceId, //设置traceId
		})

		// 在这里处理请求到达控制器函数之前的逻辑

		// 调用下一个中间件，或者控制器处理函数，具体得看注册了多少个中间件。
		c.Next()
		// 在这里可以处理请求返回给用户之前的逻辑
		latency := time.Since(t) // 计算整个请求过程花费的时间
		uri := c.Request.RequestURI
		log.Info("接口:", uri, " 接口耗时: ", latency)
	}
}
